SQLAlchemy 是可以用來存取資料庫的套件,屬於 ORM 框架,只需要 Python 的語法,ORM 會自動將 Python 映射到對應的 SQL 語法,進行資料庫存取
利用 SQLAlchemy 建立一個 SQLite 資料庫
```
# 從 SQLAlchemy 引入需要的功能,包括創建資料庫引擎、定義表格結構和聚合函數
from sqlalchemy import create_engine, Column, Integer, String, Float, func
# 從 SQLAlchemy 引入 ORM 工具,用於定義基礎類和創建會話
from sqlalchemy.orm import declarative_base, sessionmaker
```
# 創建資料庫引擎,連接到 SQLite 資料庫 'ex.db'
engine = create_engine('sqlite:///ex.db')
# 創建 Base 類,所有的 ORM 類將繼承這個類
Base = declarative_base()
# 定義 ORM 類 Sales,對應 'sales' 表格
class Sales(Base):
__tablename__ = 'sales' # 設定表格名稱為 'sales'
# 定義表格結構
id = Column(Integer, primary_key=True) # id 欄位,資料類型為整數(Integer),並設為主鍵
product = Column(String) # product 欄位,資料類型為字串(String),儲存產品名稱
quantity = Column(Integer) # quantity 欄位,資料類型為整數(Integer),儲存銷售數量
price = Column(Float) # price 欄位,資料類型為浮點數(Float),儲存產品單價
# 創建所有表格,根據 Base 類中的模型定義
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine) # 創建 Session 類,並將其與資料庫引擎綁定
session = Session() # 創建 Session 實例,用於管理資料庫事務
new_sales = [
Sales(product='Product A', quantity=10, price=9.99),
Sales(product='Product B', quantity=20, price=19.99),
Sales(product='Product C', quantity=5, price=14.99),
Sales(product='Product D', quantity=15, price=24.99)
]
session.add_all(new_sales) # 將新記錄加入會話中
session.commit() # 提交會話,將修改內容存到資料庫
print("資料創建成功。")
print("原始數據:")
results = session.query(Sales).all()
for result in results: # 遍歷查詢結果
print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")
# 更新 'Product A' 的價格
session.query(Sales).filter(Sales.product == 'Product A').update({Sales.price: 10.99})
# 提交會話,保存更改
session.commit()
print("資料更新成功。")
# 刪除 'Product B'
session.query(Sales).filter(Sales.product == 'Product B').delete()
# 提交會話,儲存修改後的資料
session.commit()
print("資料刪除成功。")
print("修改後的資料:")
updated_results = session.query(Sales).all()
for result in updated_results: # 遍歷查詢結果
print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")
session.close()
完整程式:
from sqlalchemy import create_engine, Column, Integer, String, Float, func
from sqlalchemy.orm import declarative_base, sessionmaker
# 創建資料庫引擎,連接到 SQLite 資料庫 'ex.db'
engine = create_engine('sqlite:///ex.db')
# 創建 Base 類,所有的 ORM 類將繼承這個類
Base = declarative_base()
# 定義 ORM 類 Sales,對應 'sales' 表格
class Sales(Base):
__tablename__ = 'sales' # 設定表格名稱為 'sales'
# 定義表格結構
id = Column(Integer, primary_key=True) # id 欄位,資料類型為整數(Integer),並設為主鍵
product = Column(String) # product 欄位,資料類型為字串(String),儲存產品名稱
quantity = Column(Integer) # quantity 欄位,資料類型為整數(Integer),儲存銷售數量
price = Column(Float) # price 欄位,資料類型為浮點數(Float),儲存產品單價
# 創建所有表格,根據 Base 類中的模型定義
Base.metadata.create_all(engine)
# 創建 Session 類,並將其與資料庫引擎綁定
Session = sessionmaker(bind=engine)
# 創建 Session 實例,用於管理資料庫事務
session = Session()
# Create 創建
new_sales = [
Sales(product='Product A', quantity=10, price=9.99),
Sales(product='Product B', quantity=20, price=19.99),
Sales(product='Product C', quantity=5, price=14.99),
Sales(product='Product D', quantity=15, price=24.99)
]
# 將新記錄加入會話中
session.add_all(new_sales)
# 提交會話,將修改內容存到資料庫
session.commit()
print("資料創建成功。")
# Read 讀取所有記錄
print("原始數據:")
results = session.query(Sales).all()
for result in results: # 遍歷查詢結果
print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")
# Update 更新 'Product A' 的價格
session.query(Sales).filter(Sales.product == 'Product A').update({Sales.price: 10.99})
# 提交會話,保存更改
session.commit()
print("資料更新成功。")
# Delete刪除 'Product B'
session.query(Sales).filter(Sales.product == 'Product B').delete()
# 提交會話,儲存修改後的資料
session.commit()
print("資料刪除成功。")
# 列印修改後的銷售記錄
print("修改後的資料:")
updated_results = session.query(Sales).all()
for result in updated_results: # 遍歷查詢結果
print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")
# 關閉會話
session.close()
輸出結果:
參考資料:
https://hackmd.io/@shaoeChen/B1CJAsHJ3